import {
  Body,
  Controller,
  Delete,
  Get,
  Param,
  Patch,
  Post,
} from '@nestjs/common';
import { MenuService } from './menu.service';
import { CreateMenuDto } from './dto/create-menu.dto';
import { UpdateMenuDto } from './dto/update-menu.dto';
import { HasPerms } from '../../../common/decorator/my.decorator';
import { Perm } from '../../../util/enum/perm.enum';

@Controller()
export class MenuController {
  constructor(private readonly menuService: MenuService) {}

  /**
   * 获取菜单的树状结构(只包含菜单和目录)
   *  用在菜单添加/编辑时,上面的父级菜单栏
   *
   */

  @HasPerms([[Perm.SysMenuAdd], [Perm.SysMenuEdit]])
  @Get('select')
  findForSelect() {
    return this.menuService.findForSelect((a) => [1, 2].includes(a.type));
  }

  /**
   * 获取菜单的树状结构,包含全部类型
   * 用在角色分 配/选择 菜单时候的菜单树
   */

  @HasPerms(Perm.SysRoleSetMenus)
  @Get('allot')
  findForAllot() {
    return this.menuService.findForSelect();
  }

  /**
   * 通过id获取菜单信息,包含parent
   * @param id
   */

  @HasPerms(Perm.SysMenuEdit)
  @Get(':id')
  findOne(@Param('id') id: number) {
    return this.menuService.findOneWithParent(id);
  }

  /**
   * 菜单首页展示:
   *  如果没有查询条件,就以树状图显示
   *  如果有查询条件,就以普通表格显示,带缓存
   * @param query
   */
  @Post('list')
  findAllWithQuery(@Body('query') query: Partial<CreateMenuDto>) {
    // console.log('query', query);
    return this.menuService.findAll(query);
  }

  /**
   * 修改菜单
   * @param id
   * @param updateMenuDto
   */

  @HasPerms(Perm.SysMenuEdit)
  @Patch(':id')
  update(@Param('id') id: number, @Body() updateMenuDto: UpdateMenuDto) {
    return this.menuService.update(id, updateMenuDto);
  }

  /**
   * 删除菜单
   * @param id
   */

  @HasPerms(Perm.SysMenuDelete)
  @Delete(':id')
  remove(@Param('id') id: number) {
    return this.menuService.remove(id);
  }

  /**
   * 创建菜单
   * @param createMenuDto
   */

  @HasPerms(Perm.SysMenuAdd)
  @Post()
  create(@Body() createMenuDto: CreateMenuDto) {
    return this.menuService.create(createMenuDto);
  }
}
